from _hashlib import openssl_md5, openssl_sha1


def checkVariableType(opname, btype, value):
    """Verifica se a variavel 'value' e do tipo
    'btype'. O campo 'opname' e usado para gerar
    o ValueError, e deve ser uma string com o nome
    do campo que esta sendo checado."""
    if not isinstance(value, btype):
        raise ValueError('Parameter \'%s\' isn\'t a %s type' % (opname, btype.__name__))
        return;


def md5sum(string='', isfile=True, fileobj=None, compare=None):
    """Calcula o md5 de um arquivo, caso isfile
    seja False retorna a soma md5 da string informada.
    AVISO: Se isfile for True um IOError pode ser
    gerado."""
    
    #Checa se fileobj e uma instancia de file
    if isinstance(fileobj, file):
        hso = openssl_md5()
        fileobj.seek(0)             #Zera o ponteiro para evitar erros
        for ln in iter(fileobj):
            hso.update(ln)
        
        if isinstance(compare, str):
            return compare.lower() == hso.hexdigest().lower()
        
        return hso.hexdigest()
    
    if isfile:
        fp = open(string, 'r')
        return md5sum(fileobj=fp, compare=compare)
    
    hs = openssl_md5(string).hexdigest()
    if isinstance(compare, str):
        return compare.lower() == hs.lower()
    
    return hs


def sha1sum(string='', isfile=True, fileobj=None, compare=None):
    """Calcula o sha1 de um arquivo, caso isfile
    seja False retorna a soma md5 da string informada.
    AVISO: Se isfile for True um IOError pode ser
    gerado."""
    
    #Checa se fileobj e uma instancia de file
    if isinstance(fileobj, file):
        hso = openssl_sha1()
        fileobj.seek(0)             #Zera o ponteiro para evitar erros
        for ln in iter(fileobj):
            hso.update(ln)
        
        if isinstance(compare, str):
            return compare.lower() == hso.hexdigest().lower()
        
        return hso.hexdigest()
    
    if isfile:
        fp = open(string, 'r')
        return sha1sum(fileobj=fp, compare=compare)
    
    hs = openssl_sha1(string).hexdigest()
    if isinstance(compare, str):
        return compare.lower() == hs.lower()
    
    return hs
